package Sequence;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.Sequence;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Track;


public class CreatedSequence implements ISequence{
	private static final long serialVersionUID = 1L;

	/**
	 * Creer une sequence grace a des notes generees aleatoirement
	 */
	@Override
	public Sequence create() {			
		Sequence seq = null;
		Track piste = null;
		
		try {
			seq = new Sequence(Sequence.PPQ, 4);
			piste = seq.createTrack();
		} catch (InvalidMidiDataException e) {
			System.out.println("ERROR: Invalid midi file.");
		}
		
		// maintenant créer deux événements midi (contenant un message midi)
		int r = 0;
		for (int i = 0; i < 100; i+= 4) {

			r = (int) ((Math.random() * 50) + 1);

			// ajouter les événements à la piste

			// 144 = noteOn, 1 = piano, 44 = la note, 100 = vélocité
			piste.add(makeEvent(144,2,r,100,i));

			/* Pour suivre le rythme. Nous insérons notre PROPRE ControllerEvent :
			 * 176 indique que le type de l'événement est ControllerEvent) 
			 * avec un argument pour le numéro d'événement, 127. 
			 * Cet événement ne fera RIEN ! 
			 * Il n'est là QUE pour que nous ayons un événement chaque fois qu'une note est jouée. 
			 * Autrement dit, sa seule raison d'être est qu'un évènement se déclenche 
			 * que NOUS puissions écouter (impossible d'écouter NOTE ON/OFF ). 
			 * Cet événement a lieu sur le MÊME temps que NOTE ON. 
			 */
			piste.add(makeEvent(176,1,127,0,i));

			// 128 = noteOff				
			piste.add(makeEvent(128,1,r,100,i + 2));

		} // fin de la boucle
		return seq;
	}
	
	/**
	 * Creer un evenement (note)
	 * @param comd
	 * @param can
	 * @param un
	 * @param deux
	 * @param tic
	 * @return
	 */
	private MidiEvent makeEvent(int comd, int can, int un, int deux, int tic) {
		MidiEvent evenement = null;
			ShortMessage a = new ShortMessage();
			try {
				a.setMessage(comd, can, un, deux);
				evenement = new MidiEvent(a, tic);
			} catch (InvalidMidiDataException e) {
				System.out.println("ERROR: Invalid midi file.");
			}
		return evenement;
	}

}
